
#ifndef CABLE_H_
#define CABLE_H_

#include "PuntoQuiebre.h"
#include <list>
#include "../Constantes.h"


/*
 * La clase cable la utiliza la vista para repintar. Esta relacionada con las conexiones, por cada
 * conexion existe un cable
 */
class Cable  {
private:
	std::list<PuntoQuiebre*> lista_puntos;
	bool seleccionado;
	bool recalculando_cable;

	//Estado recalculando, si se esta moviendo un extremo del cable, se setea en MOVIENDO_INICIO o MOVIENDO_FIN
	int estado_recalculando;
	int nro_id;
public:
	Cable();

	void agregar_punto(int x, int y);

	/*
	 * Pone el cable en estado moviendo inicio del cable, cuando se inicia una traslacion y hay un
	 * cable conectado desde el comienzo al elemento, se llama a esta operacion
	 */
	void moviendo_inicio(){
		this->recalculando_cable = true;
		this->estado_recalculando = MOVIENDO_INICIO;
	}

	/*
	 * Pone el cable en estado moviendo fin del cable, cuando se inicia una traslacion y hay un
	 * cable conectado desde el final al elemento, se llama a esta operacion
	 */
	void moviendo_fin(){
		this->recalculando_cable = true;
		this->estado_recalculando = MOVIENDO_FINAL;
	}

	std::list<PuntoQuiebre*> get_lista(){
		return lista_puntos;
	}

	bool is_seleccionado(){
		return seleccionado;
	}

	bool is_moviendo_extremo(){
		return recalculando_cable;
	}

	void seleccionar(){
		this->seleccionado = true;
	}

	void deshacer_seleccion(){
		this->seleccionado = false;
		this->recalculando_cable = false;
		this->estado_recalculando = INVALIDO;
	}

	int get_id(){return this->nro_id;}

	void set_id(int id) {this->nro_id = id;}


	/*
	 * Recalcula el camino segun el nuevo extremo que se le pasa por parametro
	 */
	void camino_nuevo_extremo (int posicion_x, int posicion_y);

	/*
	 * Recalcula el camino relativamente segun la posicion que tenia antes
	 */
	void recalcular_camino_relativo(int referencia_x, int referencia_y, int x_actual, int y_actual);

	/*
	 * Recalcula el camino del cable desde el punto de inicio hasta el final
	 */
	void recalcular_camino (int inicio_x, int inicio_y, int fin_x, int fin_y);

	/*
	 * Traslada el cable en posicion relativa en posicion x
	 */
	void trasladar_x_rel(int inicial_x, int final_x);

	/*
	 * Traslada el cable en posicion relativa en posicion y
	 */
	void trasladar_y_rel(int inicial_y, int final_y);

	virtual ~Cable();
};

#endif /* CABLE_H_ */
